// 引入request请求函数
import { request } from '../../request/request'

Page({

  /**
   * 页面的初始数据
   */
  data: {
    // 购物车数据
    cartList: [],
    // 购物车总数
    cartTotal: '',
    // 全选框状态
    allChecked: true,
    // 控制是否显示编辑栏信息
    showEditBar: false
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    this.getCartData()
  },
  // 发送请求，获取购物车数据
  async getCartData() {
    const res = await request({url: '/cart/index'})
    let { cartList, cartTotal } = res.data
    // 获取全选框状态
    this.getAllChecked(cartList)
    this.setData({
      cartList,
      cartTotal
    })
  },
  // 发送数据更新购物车商品数据
  async updateCartData(params) {
    const res = await request({url: '/cart/update', method: 'POST', data: params})
    this.setData({
      cartList: res.data.cartList,
      cartTotal: res.data.cartTotal
    })
  },
  // 点击+、-增减商品数量
  handleEditNum(e) {
    // 根据传递的参数判断增、减操作
    let { params, id } = e.currentTarget.dataset
    // 获取商品相关参数
    let { cartList } = this.data
    // 获取索引值
    let index = cartList.findIndex(item => item.id === id)
    let { number } = cartList[index]
    let productId = cartList[index].product_id
    let goodsId = cartList[index].goods_id
    // 若商品数量为1且进行减少操作，直接return
    if (params === -1 && number <= 1) {
      wx.showToast({
        title: '最少购买一件哦！',
        icon: 'none',
        image: '',
        duration: 1500,
        mask: true
      })
      return
    } else {
      // 增、减数量
      number += params
    }
    // 准备发送数据的相关参数
    let updateInfo = { productId, goodsId, number, id }
    // 发送数据更新购物车商品数据
    this.updateCartData(updateInfo)
  },
  // 监听直接输入更改商品数量
  handleBlur(e) {
    // 获取输入框内容
    let { value } = e.detail
    let { id } = e.currentTarget.dataset
    // 获取商品相关参数
    let { cartList } = this.data
    // 获取索引值
    let index = cartList.findIndex(item => item.id === id)
    let { number } = cartList[index]
    // 启用正则匹配，只能输入正整数
    value = value.replace(/[^\d.]/g, '')
    // 正则匹配后，若值为空，让其=1
    if (!parseInt(value)) value = 1
    // 有小数点，取整
    number = parseInt(value)
    let productId = cartList[index].product_id
    let goodsId = cartList[index].goods_id
    // 准备发送数据的相关参数
    let updateInfo = { productId, goodsId, number, id }
    // 发送数据更新购物车商品数据
    this.updateCartData(updateInfo)
  },
  // 发送请求，更新复选框状态
  async updateCheckedStatus(productIds, isChecked) {
    const res = await request({url: '/cart/checked', method: 'POST', data: { productIds, isChecked }})
    console.log(res)
    let { cartList, cartTotal } = res.data
    // 获取全选框状态
    this.getAllChecked(cartList)
    // 更新页面显示数据data
    this.setData({
      cartList,
      cartTotal
    })
  },
  // 监听点击复选框事件
  async handleCheckedChange(e) {
    // 准备参数
    let { index } = e.currentTarget.dataset
    let { cartList } = this.data
    let { product_id } = cartList[index]
    // 获取该商品的checked状态
    let { checked } = cartList[index]
    // 复选框checked为true?,是则发送参数0，不是则发送参数1
    let isChecked = checked ? 0 : 1
    // 更新商品选中状态
    this.updateCheckedStatus(product_id, isChecked)
  },
  // 获取全选框状态
  getAllChecked(cartList) {
    let { allChecked } = this.data
    // 若购物车数组为空
    if (cartList.length === 0) {
      allChecked = false
    } else {
      // 若购物车数组中有一个checked不是1(即未选中)，则全选框为false
      allChecked = cartList.every(item => item.checked === 1)
    }
    // 更新全选框状态
    this.setData({
      allChecked
    })
  },
  // 监听点击全选框事件
  async handleAllCheckedChange() {
    let { allChecked, cartList } = this.data
    allChecked = !allChecked
    // 转换checked状态，若选中，则为1;若未选中，则为0
    let isChecked = allChecked ? 1 : 0
    // 准备参数
    let productIds = cartList.map(item => item.product_id)
    // 转换成字符串
    productIds = productIds.join(',')
    // 更新商品选中状态
    this.updateCheckedStatus(productIds, isChecked)
  },
  // 监听点击编辑按钮事件
  handleEdit() {
    let { showEditBar } = this.data
    showEditBar = !showEditBar
    this.setData({
      showEditBar
    })
  },
  // 监听点击删除按钮事件
  async handleDelete() {
    let { cartList } = this.data
    // 过滤出选中的商品的product_id，作为参数
    let productIds = cartList.map(item => {
      if(item.checked === 1) {
        return item.product_id
      }
    })
    // 转换成以逗号分割的字符串
    productIds = productIds.join(',')
    // 发送请求，删除选中商品
    const res = await request({url: '/cart/delete', method: 'POST', data: { productIds }})
    // 更新页面显示数据data
    this.setData({
      cartList: res.data.cartList,
      cartTotal:  res.data.cartTotal
    })
    this.getAllChecked(res.data.cartList)
  },
  // 监听点击下单按钮事件,订单确认
  async handleCheckOutOrder() {
    let { cartTotal } = this.data
    // 若购物车选中商品数量<= 0,则提示用户
    if (cartTotal.checkedGoodsCount <= 0) {
      wx.showToast({
        title: '最少购买一件哦！',
        icon: 'none',
        image: '',
        duration: 1500,
        mask: true
      })
    } else {
      // 跳转至订单确认页
      wx.navigateTo({
        url: '/pages/order_checkout/order_checkout'
      })
    }
  }
})